package com.niit.covid.topN;


import com.niit.covid.bean.CovidBean;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * @author:Ys
 * @date: 2022年08月12日 17:35
 * @desc: 需求:找出美国疫情数据中，每个州state的确诊案例数最多的县county前3个。Top3问题。
 * 分析：
 * 自定义对象，在map阶段将“州state和累计确诊病例数cases”作为key输出，重写对象的排序规则，首先根据州的正序排序，如果州相等，按照确诊病例数cases倒序排序，发送到reduce。
 * 在reduce端利用自定义分组规则，将州state相同的分为一组，然后遍历取值，取出每组中的前3个即可。
 * 为了验证验证结果方便，可以在输出的时候以cases作为value，实际上为空即可，value并不实际意义。
 */
public class CovidTopNMapper extends Mapper<LongWritable, Text, CovidBean,LongWritable> {

    CovidBean outKey = new CovidBean();
    LongWritable outValue = new LongWritable();

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String[] fields = value.toString().split(",");
        //封装数据： 州 县 确诊病例
        String state = fields[2];
        String county = fields[1];
        long cases = Long.parseLong(fields[3]);

        outKey.set(state,county,cases);
        outValue.set(cases); //并没有实际意义，只是为了在reduce端进行遍历而已

        context.write(outKey,outValue);

    }
}
